/**
 * 统一部署管理器
 * 根据系统自动选择最佳传输方式
 * @author lihengtt <lihengsir@gmail.com>
 * @github https://github.com/lihengtt
 */
import * as os from 'os';
import { RsyncManager } from './rsyncManager';
import { SftpManager } from './sftpManager';
import { WindowsDeployManager } from './windowsDeployManager';
import { ServerInfo } from './types';
import { ConfigManager } from './configManager';
import { RemoteFile } from './remoteExplorer';
// import { ChildProcess } from 'child_process';

export class DeploymentManager {
    private manager: RsyncManager | SftpManager | WindowsDeployManager;
    private configManager: ConfigManager;
    
    constructor(configManager: ConfigManager) {
        this.configManager = configManager;
        
        // 根据系统自动选择最佳方案
        if (os.platform() === 'win32') {
            // Windows优先使用SFTP，fallback到SCP
            this.manager = new SftpManager();
        } else {
            // Linux/macOS使用SFTP以支持完整的SSH文件操作功能
            // 包括文件列表、目录创建、文件删除等远程管理功能
            this.manager = new SftpManager();
        }
    }
    
    /**
     * 测试连接
     * @param serverInfo - 服务器信息（可选，如果不提供则使用配置中的信息）
     * @returns Promise<boolean> - 连接是否成功
     * @author lihengtt <lihengsir@gmail.com>
     */
    async testConnection(serverInfo?: ServerInfo): Promise<boolean> {
        if (this.manager instanceof SftpManager) {
            const config = serverInfo || this.configManager.getConfig()?.serverInfo;
            if (!config) {
                return false;
            }
            return await this.manager.connect(config);
        } else if (this.manager instanceof WindowsDeployManager) {
            const config = serverInfo || this.configManager.getConfig()?.serverInfo;
            if (!config) {
                return false;
            }
            return await this.manager.testConnection(config);
        } else if (this.manager instanceof RsyncManager) {
            const result = await this.manager.testConnection();
            return result.success;
        }
        return false;
    }
    
    /**
     * 上传文件
     * @param localPath - 本地文件路径
     * @param remotePath - 远程文件路径（可选）
     * @returns Promise<boolean> - 上传是否成功
     * @author lihengtt <lihengsir@gmail.com>
     */
    /**
     * 上传文件
     * @param localPath - 本地文件路径
     * @param remotePath - 远程文件路径（可选）
     * @returns Promise<boolean> - 上传是否成功
     * @author lihengtt <lihengsir@gmail.com>
     */
    async uploadFile(localPath: string, remotePath?: string): Promise<boolean> {
        if (this.manager instanceof SftpManager) {
            const config = this.configManager.getConfig();
            if (!config || !remotePath) {
                return false;
            }
            const connected = await this.manager.connect(config.serverInfo);
            if (connected) {
                return await this.manager.uploadFile(localPath, remotePath);
            }
        } else if (this.manager instanceof WindowsDeployManager) {
            const config = this.configManager.getConfig();
            if (!config || !remotePath) {
                return false;
            }
            // 修复参数顺序：localPath, serverInfo, remotePath
            return await this.manager.uploadFile(localPath, config.serverInfo, remotePath);
        } else if (this.manager instanceof RsyncManager) {
            const result = await this.manager.syncFile(localPath);
            return result.success;
        }
        return false;
    }
    
    /**
     * 下载文件
     * @param remotePath - 远程文件路径
     * @param localPath - 本地文件路径
     * @returns Promise<boolean> - 下载是否成功
     * @author lihengtt <lihengsir@gmail.com>
     */
    /**
     * 下载文件
     * @param remotePath - 远程文件路径
     * @param localPath - 本地文件路径
     * @returns Promise<boolean> - 下载是否成功
     * @author lihengtt <lihengsir@gmail.com>
     */
    async downloadFile(remotePath: string, localPath: string): Promise<boolean> {
        if (this.manager instanceof SftpManager) {
            const config = this.configManager.getConfig();
            if (!config) {
                return false;
            }
            const connected = await this.manager.connect(config.serverInfo);
            if (connected) {
                return await this.manager.downloadFile(remotePath, localPath);
            }
        } else if (this.manager instanceof WindowsDeployManager) {
            const config = this.configManager.getConfig();
            if (!config) {
                return false;
            }
            // 修复参数顺序：remotePath, serverInfo, localPath
            return await this.manager.downloadFile(remotePath, config.serverInfo, localPath);
        } else if (this.manager instanceof RsyncManager) {
            const result = await this.manager.downloadFile(remotePath, localPath);
            return result.success;
        }
        return false;
    }
    
    /**
     * 同步所有文件
     * @returns Promise<boolean> - 同步是否成功
     * @author lihengtt <lihengsir@gmail.com>
     */
    async syncAll(): Promise<boolean> {
        if (this.manager instanceof RsyncManager) {
            const result = await this.manager.syncAll();
            return result.success;
        }
        // SFTP 和 Windows 管理器暂不支持批量同步
        return false;
    }
    
    /**
     * 列出远程目录文件
     * @param remotePath - 远程目录路径
     * @returns Promise<RemoteFile[]> - 远程文件列表
     * @author lihengtt <lihengsir@gmail.com>
     */
    async listFiles(remotePath: string): Promise<RemoteFile[]> {
        if (this.manager instanceof SftpManager) {
            const config = this.configManager.getConfig();
            if (!config) {
                throw new Error('请先配置服务器连接信息');
            }
            // 确保先建立连接
            const connected = await this.manager.connect(config.serverInfo);
            if (!connected) {
                throw new Error('SSH连接失败，请检查服务器配置');
            }
            return await this.manager.listFiles(remotePath);
        } else if (this.manager instanceof WindowsDeployManager) {
            // WindowsDeployManager暂不支持文件列表，返回空数组
            return [];
        } else if (this.manager instanceof RsyncManager) {
            // RsyncManager暂不支持文件列表，返回空数组
            return [];
        }
        return [];
    }

    /**
     * 创建远程目录
     * @param remotePath - 远程目录路径
     * @returns Promise<boolean> - 是否成功
     * @author lihengtt <lihengsir@gmail.com>
     */
    async createRemoteDirectory(remotePath: string): Promise<boolean> {
        if (this.manager instanceof SftpManager) {
            const config = this.configManager.getConfig();
            if (!config) {
                return false;
            }
            // 确保先建立连接
            const connected = await this.manager.connect(config.serverInfo);
            if (!connected) {
                return false;
            }
            return await this.manager.createDirectory(remotePath);
        } else if (this.manager instanceof WindowsDeployManager) {
            // WindowsDeployManager暂不支持目录创建
            return false;
        } else if (this.manager instanceof RsyncManager) {
            // RsyncManager暂不支持目录创建
            return false;
        }
        return false;
    }

    /**
     * 删除远程文件或目录
     * @param remotePath - 远程文件路径
     * @param isDirectory - 是否为目录
     * @returns Promise<boolean> - 是否成功
     * @author lihengtt <lihengsir@gmail.com>
     */
    async deleteRemoteFile(remotePath: string, isDirectory: boolean = false): Promise<boolean> {
        if (this.manager instanceof SftpManager) {
            const config = this.configManager.getConfig();
            if (!config) {
                return false;
            }
            // 确保先建立连接
            const connected = await this.manager.connect(config.serverInfo);
            if (!connected) {
                return false;
            }
            return await this.manager.deleteFile(remotePath, isDirectory);
        } else if (this.manager instanceof WindowsDeployManager) {
            // WindowsDeployManager暂不支持文件删除
            return false;
        } else if (this.manager instanceof RsyncManager) {
            // RsyncManager暂不支持文件删除
            return false;
        }
        return false;
    }

    /**
     * 获取当前使用的管理器类型
     * @returns string - 管理器类型名称
     * @author lihengtt <lihengsir@gmail.com>
     */
    getManagerType(): string {
        if (this.manager instanceof SftpManager) {
            return 'SftpManager';
        } else if (this.manager instanceof WindowsDeployManager) {
            return 'WindowsDeployManager';
        } else if (this.manager instanceof RsyncManager) {
            return 'RsyncManager';
        }
        return 'Unknown';
    }
    
    /**
     * 清理所有资源
     * 在插件停用时调用，确保所有进程和连接被正确清理
     * @author lihengtt <lihengsir@gmail.com>
     */
    async cleanup(): Promise<void> {
        try {
            if (this.manager instanceof SftpManager) {
                await this.manager.cleanup();
            } else if (this.manager instanceof RsyncManager) {
                this.manager.killAllProcesses();
            } else if (this.manager instanceof WindowsDeployManager) {
                // WindowsDeployManager 暂无需特殊清理
            }
        } catch (error) {
            console.error('清理部署管理器资源时发生错误:', error);
        }
    }
}